home *** CD-ROM | disk | FTP | other *** search
/ Hardcore Visual Basic 5.0 (2nd Edition) / Hardcore Visual Basic 5.0 - Second Edition (1997)(Microsoft Press).iso / Code / MERIWE~1.FRM < prev    next >
Text File  |  1997-06-14  |  29KB  |  832 lines

  1. VERSION 5.00
  2. Object = "{6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.1#0"; "comctl32.ocx"
  3. Begin VB.Form FMeriwether 
  4.    Caption         =   "Meriwether"
  5.    ClientHeight    =   5745
  6.    ClientLeft      =   630
  7.    ClientTop       =   3450
  8.    ClientWidth     =   8970
  9.    ClipControls    =   0   'False
  10.    Icon            =   "Meriwether.frx":0000
  11.    LinkTopic       =   "Form1"
  12.    MouseIcon       =   "Meriwether.frx":0442
  13.    ScaleHeight     =   5745
  14.    ScaleWidth      =   8970
  15.    Begin ComctlLib.Toolbar bar 
  16.       Align           =   1  'Align Top
  17.       Height          =   390
  18.       Left            =   0
  19.       TabIndex        =   3
  20.       Top             =   0
  21.       Width           =   8970
  22.       _ExtentX        =   15822
  23.       _ExtentY        =   688
  24.       ButtonWidth     =   614
  25.       ButtonHeight    =   572
  26.       ImageList       =   "imlstToolbar"
  27.       _Version        =   327680
  28.       BeginProperty Buttons {0713E452-850A-101B-AFC0-4210102A8DA7} 
  29.          NumButtons      =   19
  30.          BeginProperty Button1 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  31.             Key             =   ""
  32.             Object.Tag             =   ""
  33.             Style           =   4
  34.             Object.Width           =   2200
  35.             Value           =   -1
  36.          EndProperty
  37.          BeginProperty Button2 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  38.             Key             =   "Up"
  39.             Description     =   "Up One Level"
  40.             Object.ToolTipText     =   "Up One Level"
  41.             Object.Tag             =   ""
  42.             ImageIndex      =   1
  43.          EndProperty
  44.          BeginProperty Button3 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  45.             Key             =   ""
  46.             Object.Tag             =   ""
  47.             Style           =   3
  48.             Value           =   -1
  49.          EndProperty
  50.          BeginProperty Button4 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  51.             Key             =   "Map"
  52.             Description     =   "Map Network Drive"
  53.             Object.ToolTipText     =   "Map Network Drive"
  54.             Object.Tag             =   ""
  55.             ImageIndex      =   2
  56.          EndProperty
  57.          BeginProperty Button5 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  58.             Key             =   "Unmap"
  59.             Description     =   "Disconnect Network Drive"
  60.             Object.ToolTipText     =   "Disconnect Network Drive"
  61.             Object.Tag             =   ""
  62.             ImageIndex      =   3
  63.          EndProperty
  64.          BeginProperty Button6 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  65.             Key             =   ""
  66.             Object.Tag             =   ""
  67.             Style           =   3
  68.             Value           =   -1
  69.          EndProperty
  70.          BeginProperty Button7 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  71.             Key             =   "Cut"
  72.             Description     =   "Cut"
  73.             Object.ToolTipText     =   "Cut"
  74.             Object.Tag             =   ""
  75.             ImageIndex      =   4
  76.          EndProperty
  77.          BeginProperty Button8 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  78.             Key             =   "Copy"
  79.             Description     =   "Copy"
  80.             Object.ToolTipText     =   "Copy"
  81.             Object.Tag             =   ""
  82.             ImageIndex      =   5
  83.          EndProperty
  84.          BeginProperty Button9 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  85.             Key             =   "Paste"
  86.             Description     =   "Paste"
  87.             Object.ToolTipText     =   "Paste"
  88.             Object.Tag             =   ""
  89.             ImageIndex      =   6
  90.          EndProperty
  91.          BeginProperty Button10 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  92.             Key             =   ""
  93.             Object.Tag             =   ""
  94.             Style           =   3
  95.             Value           =   -1
  96.          EndProperty
  97.          BeginProperty Button11 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  98.             Key             =   "Undo"
  99.             Description     =   "Undo"
  100.             Object.ToolTipText     =   "Undo"
  101.             Object.Tag             =   ""
  102.             ImageIndex      =   7
  103.          EndProperty
  104.          BeginProperty Button12 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  105.             Key             =   ""
  106.             Object.Tag             =   ""
  107.             Style           =   3
  108.             Value           =   -1
  109.          EndProperty
  110.          BeginProperty Button13 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  111.             Key             =   "Delete"
  112.             Description     =   "Delete"
  113.             Object.ToolTipText     =   "Delete"
  114.             Object.Tag             =   ""
  115.             ImageIndex      =   8
  116.          EndProperty
  117.          BeginProperty Button14 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  118.             Key             =   "Properties"
  119.             Description     =   "Properties"
  120.             Object.ToolTipText     =   "Properties"
  121.             Object.Tag             =   ""
  122.             ImageIndex      =   9
  123.          EndProperty
  124.          BeginProperty Button15 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  125.             Key             =   ""
  126.             Object.Tag             =   ""
  127.             Style           =   3
  128.             Value           =   -1
  129.          EndProperty
  130.          BeginProperty Button16 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  131.             Key             =   "Large"
  132.             Description     =   "Large Icons"
  133.             Object.ToolTipText     =   "Large Icons"
  134.             Object.Tag             =   ""
  135.             ImageIndex      =   10
  136.             Style           =   2
  137.          EndProperty
  138.          BeginProperty Button17 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  139.             Key             =   "Small"
  140.             Description     =   "Small Icons"
  141.             Object.ToolTipText     =   "Small Icons"
  142.             Object.Tag             =   ""
  143.             ImageIndex      =   11
  144.             Style           =   2
  145.          EndProperty
  146.          BeginProperty Button18 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  147.             Key             =   "List"
  148.             Description     =   "List"
  149.             Object.ToolTipText     =   "List"
  150.             Object.Tag             =   ""
  151.             ImageIndex      =   12
  152.             Style           =   2
  153.          EndProperty
  154.          BeginProperty Button19 {0713F354-850A-101B-AFC0-4210102A8DA7} 
  155.             Key             =   "Details"
  156.             Description     =   "Details"
  157.             Object.ToolTipText     =   "Details"
  158.             Object.Tag             =   ""
  159.             ImageIndex      =   13
  160.             Style           =   2
  161.          EndProperty
  162.       EndProperty
  163.       MouseIcon       =   "Meriwether.frx":0594
  164.       Begin VB.CommandButton cmdDir 
  165.          Caption         =   "..."
  166.          Height          =   270
  167.          Left            =   1845
  168.          TabIndex        =   5
  169.          Top             =   60
  170.          Width           =   270
  171.       End
  172.       Begin VB.TextBox txtDir 
  173.          Height          =   285
  174.          Left            =   105
  175.          Locked          =   -1  'True
  176.          TabIndex        =   4
  177.          Top             =   45
  178.          Width           =   1656
  179.       End
  180.    End
  181.    Begin ComctlLib.StatusBar stat 
  182.       Align           =   2  'Align Bottom
  183.       Height          =   348
  184.       Left            =   0
  185.       TabIndex        =   2
  186.       Top             =   5400
  187.       Width           =   8976
  188.       _ExtentX        =   15822
  189.       _ExtentY        =   609
  190.       SimpleText      =   ""
  191.       _Version        =   327680
  192.       BeginProperty Panels {0713E89E-850A-101B-AFC0-4210102A8DA7} 
  193.          NumPanels       =   2
  194.          BeginProperty Panel1 {0713E89F-850A-101B-AFC0-4210102A8DA7} 
  195.             TextSave        =   ""
  196.             Key             =   "Objects"
  197.             Object.Tag             =   ""
  198.          EndProperty
  199.          BeginProperty Panel2 {0713E89F-850A-101B-AFC0-4210102A8DA7} 
  200.             AutoSize        =   1
  201.             Object.Width           =   12753
  202.             Text            =   "Add your status text here"
  203.             TextSave        =   "Add your status text here"
  204.             Key             =   "Status"
  205.             Object.Tag             =   ""
  206.          EndProperty
  207.       EndProperty
  208.       MouseIcon       =   "Meriwether.frx":05B0
  209.    End
  210.    Begin ComctlLib.ListView lvwFiles 
  211.       Height          =   4344
  212.       Left            =   2856
  213.       TabIndex        =   1
  214.       Top             =   960
  215.       Width           =   6228
  216.       _ExtentX        =   11007
  217.       _ExtentY        =   7673
  218.       View            =   3
  219.       LabelEdit       =   1
  220.       MultiSelect     =   -1  'True
  221.       LabelWrap       =   -1  'True
  222.       HideSelection   =   -1  'True
  223.       _Version        =   327680
  224.       ForeColor       =   -2147483630
  225.       BackColor       =   16777215
  226.       BorderStyle     =   1
  227.       Appearance      =   1
  228.       MouseIcon       =   "Meriwether.frx":05CC
  229.       NumItems        =   0
  230.    End
  231.    Begin ComctlLib.TreeView tvwFiles 
  232.       Height          =   4848
  233.       Left            =   96
  234.       TabIndex        =   0
  235.       Top             =   468
  236.       Width           =   2712
  237.       _ExtentX        =   4789
  238.       _ExtentY        =   8546
  239.       _Version        =   327680
  240.       Indentation     =   353
  241.       LabelEdit       =   1
  242.       LineStyle       =   1
  243.       Sorted          =   -1  'True
  244.       Style           =   7
  245.       Appearance      =   1
  246.       MouseIcon       =   "Meriwether.frx":05E8
  247.    End
  248.    Begin ComctlLib.ImageList imlstSIcon 
  249.       Left            =   7080
  250.       Top             =   450
  251.       _ExtentX        =   1005
  252.       _ExtentY        =   1005
  253.       BackColor       =   -2147483643
  254.       MaskColor       =   12632256
  255.       _Version        =   327680
  256.    End
  257.    Begin ComctlLib.ImageList imlstLIcon 
  258.       Left            =   6150
  259.       Top             =   435
  260.       _ExtentX        =   1005
  261.       _ExtentY        =   1005
  262.       BackColor       =   -2147483643
  263.       MaskColor       =   12632256
  264.       _Version        =   327680
  265.    End
  266.    Begin ComctlLib.ImageList imlstToolbar 
  267.       Left            =   8025
  268.       Top             =   435
  269.       _ExtentX        =   1005
  270.       _ExtentY        =   1005
  271.       BackColor       =   -2147483643
  272.       ImageWidth      =   16
  273.       ImageHeight     =   16
  274.       MaskColor       =   12632256
  275.       _Version        =   327680
  276.       BeginProperty Images {0713E8C2-850A-101B-AFC0-4210102A8DA7} 
  277.          NumListImages   =   13
  278.          BeginProperty ListImage1 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  279.             Picture         =   "Meriwether.frx":0604
  280.             Key             =   ""
  281.          EndProperty
  282.          BeginProperty ListImage2 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  283.             Picture         =   "Meriwether.frx":07A6
  284.             Key             =   ""
  285.          EndProperty
  286.          BeginProperty ListImage3 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  287.             Picture         =   "Meriwether.frx":0948
  288.             Key             =   ""
  289.          EndProperty
  290.          BeginProperty ListImage4 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  291.             Picture         =   "Meriwether.frx":0AEA
  292.             Key             =   ""
  293.          EndProperty
  294.          BeginProperty ListImage5 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  295.             Picture         =   "Meriwether.frx":0C8C
  296.             Key             =   ""
  297.          EndProperty
  298.          BeginProperty ListImage6 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  299.             Picture         =   "Meriwether.frx":0E2E
  300.             Key             =   ""
  301.          EndProperty
  302.          BeginProperty ListImage7 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  303.             Picture         =   "Meriwether.frx":0FD0
  304.             Key             =   ""
  305.          EndProperty
  306.          BeginProperty ListImage8 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  307.             Picture         =   "Meriwether.frx":1172
  308.             Key             =   ""
  309.          EndProperty
  310.          BeginProperty ListImage9 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  311.             Picture         =   "Meriwether.frx":1314
  312.             Key             =   ""
  313.          EndProperty
  314.          BeginProperty ListImage10 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  315.             Picture         =   "Meriwether.frx":14B6
  316.             Key             =   ""
  317.          EndProperty
  318.          BeginProperty ListImage11 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  319.             Picture         =   "Meriwether.frx":1658
  320.             Key             =   ""
  321.          EndProperty
  322.          BeginProperty ListImage12 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  323.             Picture         =   "Meriwether.frx":17FA
  324.             Key             =   ""
  325.          EndProperty
  326.          BeginProperty ListImage13 {0713E8C3-850A-101B-AFC0-4210102A8DA7} 
  327.             Picture         =   "Meriwether.frx":199C
  328.             Key             =   ""
  329.          EndProperty
  330.       EndProperty
  331.    End
  332.    Begin VB.Menu mnuFile 
  333.       Caption         =   "&File"
  334.       Begin VB.Menu mnuNew 
  335.          Caption         =   "&New"
  336.       End
  337.       Begin VB.Menu mnuFileSep1 
  338.          Caption         =   "-"
  339.       End
  340.       Begin VB.Menu mnuClose 
  341.          Caption         =   "&Close"
  342.       End
  343.    End
  344.    Begin VB.Menu mnuEdit 
  345.       Caption         =   "&Edit"
  346.    End
  347.    Begin VB.Menu mnuView 
  348.       Caption         =   "&View"
  349.       Begin VB.Menu mnuToolbar 
  350.          Caption         =   "&Toolbar"
  351.          Checked         =   -1  'True
  352.       End
  353.       Begin VB.Menu mnuStatus 
  354.          Caption         =   "Status &Bar"
  355.          Checked         =   -1  'True
  356.       End
  357.       Begin VB.Menu mnuEditSep1 
  358.          Caption         =   "-"
  359.       End
  360.       Begin VB.Menu mnuDisplay 
  361.          Caption         =   "&Large Icons"
  362.          Index           =   0
  363.       End
  364.       Begin VB.Menu mnuDisplay 
  365.          Caption         =   "&Small Icons"
  366.          Index           =   1
  367.       End
  368.       Begin VB.Menu mnuDisplay 
  369.          Caption         =   "&List"
  370.          Index           =   2
  371.       End
  372.       Begin VB.Menu mnuDisplay 
  373.          Caption         =   "&Details"
  374.          Index           =   3
  375.       End
  376.       Begin VB.Menu mnuEditSep2 
  377.          Caption         =   "-"
  378.       End
  379.       Begin VB.Menu mnyArrange 
  380.          Caption         =   "&Arrange"
  381.          Begin VB.Menu mnuBy 
  382.             Caption         =   "by &Name"
  383.             Index           =   0
  384.          End
  385.          Begin VB.Menu mnuBy 
  386.             Caption         =   "by &Type"
  387.             Index           =   1
  388.          End
  389.          Begin VB.Menu mnuBy 
  390.             Caption         =   "by Si&ze"
  391.             Index           =   2
  392.          End
  393.          Begin VB.Menu mnuBy 
  394.             Caption         =   "by &Date"
  395.             Index           =   3
  396.          End
  397.       End
  398.    End
  399.    Begin VB.Menu mnuTools 
  400.       Caption         =   "&Tools"
  401.    End
  402.    Begin VB.Menu mnuHelp 
  403.       Caption         =   "&Help"
  404.    End
  405. End
  406. Attribute VB_Name = "FMeriwether"
  407. Attribute VB_GlobalNameSpace = False
  408. Attribute VB_Creatable = False
  409. Attribute VB_PredeclaredId = True
  410. Attribute VB_Exposed = False
  411. Option Explicit
  412.  
  413. Implements IUseFolder
  414.  
  415. ' Private variables
  416. Private split As New CSplitter
  417. Private xList As Single, yList As Single
  418. Private fWalkNodes As Boolean
  419. Private fFirstItem As Boolean
  420. Private sCurNode As String
  421.  
  422. ' Names of special folder locations
  423. Private sDrives As String
  424. Private sBitBucket As String
  425. Private sNetwork As String
  426. Private sFonts As String
  427. Private sPrinters As String
  428. Private sControlPanel As String
  429.  
  430.  
  431. Private Sub Form_Load()
  432.     
  433.     Dim file As New CFileInfo
  434.     If Not HasShell Then
  435.         MsgBox "This program requires the Windows enhanced user interface"
  436.         End
  437.     End If
  438.     ' Set up splitter
  439.     split.Create LeftControl:=tvwFiles, _
  440.                  RightControl:=lvwFiles, _
  441.                  Vertical:=True, _
  442.                  BorderPixels:=4, _
  443.                  AutoBorder:=True, _
  444.                  Resizeable:=True, _
  445.                  Percent:=35
  446.     SetDisplay lvwReport, True
  447.     Show
  448.     
  449.     ' Initialize special folder names
  450.     sDrives = NameFromPidl(ToPidl(CSIDL_DRIVES))
  451.     sBitBucket = NameFromPidl(ToPidl(CSIDL_BITBUCKET))
  452.     sNetwork = NameFromPidl(ToPidl(CSIDL_NETWORK))
  453.     sFonts = NameFromPidl(ToPidl(CSIDL_FONTS))
  454.     sPrinters = NameFromPidl(ToPidl(CSIDL_PRINTERS))
  455.     sControlPanel = NameFromPidl(ToPidl(CSIDL_CONTROLS))
  456.  
  457.     Refresh
  458.     HourGlass Me
  459.     Dim nodeRoot As Node
  460.     Set nodeRoot = InitDesktop
  461.     Refresh
  462.     nodeRoot.Child.EnsureVisible
  463.     Refresh
  464.     tvwFiles_NodeClick nodeRoot
  465.     HourGlass Me
  466.     bar.Refresh
  467.     
  468. End Sub
  469.  
  470. ' Special case node initialization for root
  471. Function InitDesktop() As Node
  472.     Dim folder As IVBShellFolder, pidl As Long, sKey As String
  473.     ' Get folder and pidl roots
  474.     Set folder = GetDesktopFolder
  475.     pidl = ToPidl(CSIDL_DESKTOP)
  476.     ' Create large and small image lists
  477.     With FileInfoFromFolder(folder, pidl)
  478.         imlstLIcon.ListImages.Add , .DisplayName, .LargeIcon()
  479.         imlstSIcon.ListImages.Add , .DisplayName, .SmallIcon()
  480.         ' Set TreeView and ListView to use image lists
  481.         lvwFiles.Icons = imlstLIcon
  482.         lvwFiles.SmallIcons = imlstSIcon
  483.         tvwFiles.ImageList = imlstSIcon
  484.         ' Add the desktop node
  485.         Set InitDesktop = tvwFiles.Nodes.Add(, , .DisplayName, _
  486.                                              .DisplayName, .DisplayName)
  487.         ' Mark as having children
  488.         Call tvwFiles.Nodes.Add(InitDesktop.Index, tvwChild, , ":")
  489.         ' Save subfolder in tag
  490.         InitDesktop.Tag = folder
  491.     End With
  492. End Function
  493.  
  494. Sub InitNode(folder As IVBShellFolder, ByVal pidl As Long, _
  495.              nodeCur As Variant)
  496.     ' Create file information object from folder and pidl
  497.     Dim fi As New CFileInfo, nodeNew As Node
  498.     Dim sIconKey As String, sKey As String
  499.     sCurNode = GetFolderName(folder, pidl, SHGDN_FORPARSING)
  500.     Set fi = FileInfoFromFolder(folder, pidl)
  501.     With fi
  502.         sIconKey = .DisplayName
  503.         If .ItemType = eitFile And .TypeName <> "Shortcut" Then
  504.             sIconKey = .TypeName
  505.         End If
  506.         ' Add icons
  507.         AddIconImages imlstLIcon, imlstSIcon, fi, sIconKey
  508.         ' Add new node
  509.         If .ItemType = eitFile Or .ItemType = eitDrive Then
  510.             sKey = GetFolderName(folder, pidl, SHGDN_FORPARSING)
  511.         Else
  512.             sKey = .DisplayName
  513.         End If
  514.         Set nodeNew = tvwFiles.Nodes.Add(nodeCur.Index, tvwChild, sKey, _
  515.                                          .DisplayName, sIconKey)
  516.     End With
  517.     
  518.     ' Check for children
  519.     Dim afAttr As ESFGAO
  520.     afAttr = SFGAO_FOLDER Or SFGAO_HASSUBFOLDER
  521.     folder.GetAttributesOf 1, pidl, afAttr
  522.     If afAttr And (SFGAO_FOLDER Or SFGAO_HASSUBFOLDER) Then
  523.         ' Mark as having children
  524.         Call tvwFiles.Nodes.Add(nodeNew.Index, tvwChild, , ":")
  525.         ' Get subfolder and save it in tag
  526.         Dim folderNew As IVBShellFolder
  527.         Set folderNew = BindToShell(folder, pidl)
  528.         nodeNew.Tag = folderNew
  529.     End If
  530. End Sub
  531.  
  532. Sub InitItem(folder As IVBShellFolder, ByVal pidl As Long, _
  533.              nodeCur As Variant)
  534.     ' Create file information object from folder and pidl
  535.     Dim fi As New CFileInfo, nodeNew As Node
  536.     Dim sName As String, sKey As String, Item As ListItem
  537.     If fFirstItem Then InitColumn fi, nodeCur.Text
  538.     Set fi = FileInfoFromFolder(folder, pidl)
  539.     With fi
  540.         sName = .DisplayName
  541.         sKey = sName
  542.         If .ItemType = eitFile And .TypeName <> "Shortcut" Then
  543.             sKey = .TypeName
  544.         End If
  545.         ' Add icons
  546.         AddIconImages imlstLIcon, imlstSIcon, fi, sKey
  547.         ' Add list item
  548.         Set Item = lvwFiles.ListItems.Add(, , sName, sKey, sKey)
  549.         ' Add subitems if appropriate
  550.         Select Case .ItemType
  551.         Case eitFile
  552.             If .Length Then Item.SubItems(1) = CStr(.Length \ 1000) & " KB"
  553.             Item.SubItems(2) = .TypeName
  554.             Item.SubItems(3) = Format$(.Modified, "mm/dd/yy hh:mm AMPM")
  555.             Item.SubItems(4) = Format$(.Created, "mm/dd/yy hh:mm AMPM")
  556.             Item.SubItems(5) = Format$(.Accessed, "mm/dd/yy")
  557.         Case eitDrive
  558.             Item.SubItems(1) = .DriveType
  559.             Item.SubItems(2) = Format$(.TotalKilo, "##,##0") & "MB"
  560.             Item.SubItems(3) = Format$(.FreeKilo, "##,##0") & "MB"
  561.         ' Case Else
  562.             ' No subitems
  563.         End Select
  564.     End With
  565.  
  566. End Sub
  567.  
  568. Sub InitColumn(fi As CFileInfo, sNodeText As String)
  569.     Dim col As ColumnHeader, dx As Single
  570.     lvwFiles.ColumnHeaders.Clear
  571.     ' Create ListView ColumnHeader
  572.     Select Case sNodeText
  573.     Case sBitBucket, sNetwork, sFonts, sPrinters, sControlPanel
  574.         ' Special folders with non-file items
  575.         dx = TextWidth("Very, Very Long File Name")
  576.         Set col = lvwFiles.ColumnHeaders.Add(, , "Name", dx)
  577.         col.Alignment = sbrLeft
  578.     Case sDrives ' My Computer by default, but could be changed
  579.         ' Contains mostly drives
  580.         dx = TextWidth("Root on 'LabelName' (D:)")
  581.         Set col = lvwFiles.ColumnHeaders.Add(, , "Name", dx)
  582.         col.Alignment = sbrLeft
  583.         dx = TextWidth("Floppy Missing")
  584.         Set col = lvwFiles.ColumnHeaders.Add(, , "Type", dx)
  585.         col.Alignment = sbrLeft
  586.         dx = TextWidth("Total Size")
  587.         Set col = lvwFiles.ColumnHeaders.Add(, , "Total Size", dx)
  588.         col.Alignment = sbrRight
  589.         dx = TextWidth("Free Space")
  590.         Set col = lvwFiles.ColumnHeaders.Add(, , "Free Space", dx)
  591.         col.Alignment = sbrRight
  592.     Case Else
  593.         ' Set up sizes for files
  594.         dx = TextWidth("Very Long File Name")
  595.         Set col = lvwFiles.ColumnHeaders.Add(, , "Name", dx)
  596.         col.Alignment = sbrLeft
  597.         dx = TextWidth("9,999 KB")
  598.         Set col = lvwFiles.ColumnHeaders.Add(, , "Size", dx)
  599.         col.Alignment = sbrRight
  600.         dx = TextWidth("MS-DOS Batch File")
  601.         Set col = lvwFiles.ColumnHeaders.Add(, , "Type", dx)
  602.         col.Alignment = sbrLeft
  603.         dx = TextWidth("12/25/97 12:01 AM")
  604.         Set col = lvwFiles.ColumnHeaders.Add(, , "Modified", dx)
  605.         col.Alignment = sbrLeft
  606.         Set col = lvwFiles.ColumnHeaders.Add(, , "Created", dx)
  607.         col.Alignment = sbrLeft
  608.         dx = TextWidth("12/25/97")
  609.         Set col = lvwFiles.ColumnHeaders.Add(, , "Accessed", dx)
  610.         col.Alignment = sbrLeft
  611.     End Select
  612.     fFirstItem = False
  613. End Sub
  614.  
  615. Private Function IUseFolder_UseFolder(UserData As Variant, _
  616.                                       CurFolder As Win.IVBShellFolder, _
  617.                                       ByVal ItemList As Long) As Boolean
  618.     ' Display a node or item
  619.     If fWalkNodes Then
  620.         InitNode CurFolder, ItemList, UserData
  621.     Else
  622.         InitItem CurFolder, ItemList, UserData
  623.     End If
  624. End Function
  625.  
  626. Private Sub cmdDir_Click()
  627.     txtDir.Text = BrowseForFolder()
  628.     ' To do: Should find and set path in TreeView
  629.     MsgBox "Find this directory in the TreeView: " & txtDir
  630. End Sub
  631.  
  632. Private Sub tvwFiles_Expand(ByVal Node As Node)
  633.     BugMessage "Expand: " & Node.Text
  634.     ' Remove fake child and insert real one
  635.     BugAssert Node.Child.Text = ":"
  636.     tvwFiles.Nodes.Remove Node.Child.Index
  637.     ' Processs subfolders recursively
  638.     Dim folder As IVBShellFolder, pidl As Long
  639.     Set folder = Node.Tag
  640.     fWalkNodes = True
  641.     
  642.     WalkFolders folder, Me, Node, ewmFolders
  643.  
  644. End Sub
  645.  
  646. Private Sub tvwFiles_Collapse(ByVal Node As Node)
  647.     BugMessage "Collapse: " & Node.Text
  648.     Dim i As Integer
  649.     ' Remove real children and replace with fake child
  650.     With Node.Child
  651.         For i = .LastSibling.Index To .Index Step -1
  652.             tvwFiles.Nodes.Remove i
  653.         Next
  654.     End With
  655.     tvwFiles.Nodes.Add Node.Index, tvwChild, , ":"
  656. End Sub
  657.  
  658. Private Sub tvwFiles_NodeClick(ByVal Node As Node)
  659.     BugMessage "NodeClick: " & Node.Text
  660.     ' Process items
  661.     lvwFiles.ListItems.Clear
  662.     fWalkNodes = False
  663.     fFirstItem = True
  664.     txtDir.Text = Node.Key
  665.     WalkFolders Node.Tag, Me, Node, ewmNonfolders
  666.     
  667.     With stat.Panels("Objects")
  668.         Select Case lvwFiles.ListItems.Count
  669.         Case 0
  670.             .Text = sEmpty
  671.         Case 1
  672.             .Text = "1 object"
  673.         Case Else
  674.             .Text = lvwFiles.ListItems.Count & " objects"
  675.         End Select
  676.     End With
  677.     ' To do: Add more status text
  678. End Sub
  679.  
  680. Private Sub lvwFiles_ItemClick(ByVal Item As ListItem)
  681.     ' Challenge: Put information in status bar
  682.     BugMessage "Clicked item: " & Item.Text
  683. End Sub
  684.  
  685. ' ListView doesn't have ItemDblClick so fake it
  686. Private Sub lvwFiles_ItemDblClick(ByVal Item As ListItem)
  687.     If Item Is Nothing Then Exit Sub
  688.     Dim s As String
  689.     On Error Resume Next
  690.     s = Item.SubItems(2)
  691.     If s = "File Folder" Then
  692.         BugMessage "Double Clicked Directory: " & Item.Text
  693.         ' Challenge: Need to trace through file path to find
  694.         ' and open appropriate directory in TreeView
  695.     Else
  696.         BugMessage "Double clicked item: " & Item.Text
  697.         ' To do: Turn Item.Text into a path so we can execute it
  698.         VBShellExecute Item.Text
  699.     End If
  700. End Sub
  701.  
  702. ' Save x and y for testing in DblClick
  703. Private Sub lvwFiles_MouseDown(Button As Integer, Shift As Integer, _
  704.                                x As Single, y As Single)
  705.     xList = x
  706.     yList = y
  707. End Sub
  708.  
  709. Private Sub lvwFiles_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  710.     If Button = 2 Then
  711.         Dim Item As ListItem, sPath As String
  712.         Set Item = lvwFiles.HitTest(xList, yList)
  713.         If Mid$(sCurNode, 2, 2) = ":\" Then
  714.             sPath = sCurNode & "\" & Item.Text
  715.         Else
  716.             sPath = Item.Text
  717.         End If
  718.         ' To do: Make right click work
  719.         Dim f As Boolean
  720.         f = ContextPopMenu(lvwFiles.hWnd, sPath, xList, yList)
  721.     End If
  722. End Sub
  723.  
  724. ' Create missing ItemDblClick event
  725. Private Sub lvwFiles_DblClick()
  726.     lvwFiles_ItemDblClick lvwFiles.HitTest(xList, yList)
  727. End Sub
  728.  
  729. Private Sub lvwFiles_ColumnClick(ByVal ColumnHeader As ColumnHeader)
  730. With lvwFiles
  731.     Static iLast As Integer, iCur As Integer
  732.     .Sorted = True
  733.     iCur = ColumnHeader.Index - 1
  734.     If iCur = iLast Then .SortOrder = IIf(.SortOrder = 1, 0, 1)
  735.     lvwFiles.SortKey = iCur
  736.     iLast = iCur
  737. End With
  738. End Sub
  739.  
  740. Private Sub bar_ButtonClick(ByVal Button As Button)
  741.     Select Case Button.Key
  742.     Case "Large"
  743.         SetDisplay lvwIcon, False
  744.     Case "Small"
  745.         SetDisplay lvwSmallIcon, False
  746.     Case "List"
  747.         SetDisplay lvwList, False
  748.     Case "Details"
  749.         SetDisplay lvwReport, False
  750.     Case Else
  751.         MsgBox "Left as an exercise for the reader"
  752.     End Select
  753. End Sub
  754.  
  755. Sub AddIconImages(imlstLIcon As ImageList, imlstSIcon As ImageList, _
  756.                   fi As CFileInfo, sKey As String)
  757.     Dim i As Integer
  758.     On Error Resume Next
  759.     i = imlstLIcon.ListImages(sKey).Index
  760.     If Err Then
  761.         On Error GoTo 0
  762.         imlstLIcon.ListImages.Add , sKey, fi.LargeIcon()
  763.         imlstSIcon.ListImages.Add , sKey, fi.SmallIcon()
  764.     ' Else
  765.         ' Already added
  766.     End If
  767. End Sub
  768.  
  769. Sub SetDisplay(ByVal Index As Integer, fMenu As Boolean)
  770.     Dim i As Integer
  771.     ' Check menu item
  772.     For i = 0 To 3
  773.         mnuDisplay(i).Checked = (i = Index)
  774.     Next
  775.     lvwFiles.View = Index
  776.     ' Push toolbar button
  777.     If fMenu Then
  778.         i = bar.Buttons("Large").Index + Index
  779.         bar.Buttons(i).Value = tbrPressed
  780.     End If
  781. End Sub
  782.  
  783. Private Sub mnuBy_Click(Index As Integer)
  784.     lvwFiles.Sorted = True
  785.     lvwFiles.SortKey = Index
  786. End Sub
  787.  
  788. Private Sub mnuClose_Click()
  789.     Unload Me
  790. End Sub
  791.  
  792. Private Sub mnuDisplay_Click(Index As Integer)
  793.     SetDisplay Index, True
  794. End Sub
  795.  
  796. Private Sub mnuEdit_Click()
  797.     MsgBox "Left as an exercise for the reader"
  798. End Sub
  799.  
  800. Private Sub mnuHelp_Click()
  801.     MsgBox "Left as an exercise for the reader"
  802. End Sub
  803.  
  804. Private Sub mnuNew_Click()
  805.     MsgBox "Left as an exercise for the reader"
  806. End Sub
  807.  
  808. Private Sub mnuStatus_Click()
  809.     MsgBox "Left as an exercise for the reader"
  810. End Sub
  811.  
  812. Private Sub mnuTools_Click()
  813.     MsgBox "Left as an exercise for the reader"
  814. End Sub
  815.  
  816. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  817.     split.Splitter_MouseDown Button, Shift, x, y
  818. End Sub
  819.  
  820. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  821.     split.Splitter_MouseMove Button, Shift, x, y
  822. End Sub
  823.  
  824. Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  825.     split.Splitter_MouseUp Button, Shift, x, y
  826. End Sub
  827.  
  828. Private Sub Form_Resize()
  829.     split.Splitter_Resize
  830. End Sub
  831.  
  832.